package com.demo.eshop.pdetail.thread;

import com.demo.eshop.pdetail.request.ProductInventoryCacheReloadRequest;
import com.demo.eshop.pdetail.request.ProductInventoryUpdateRequest;
import com.demo.eshop.pdetail.request.Request;
import com.demo.eshop.pdetail.request.RequestQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Callable;

/**
 * @author: e20160504
 * @date: 2018/10/29
 * @desc 执行请求的工作线程
 */
public class RequestProcesserThread implements Callable<Boolean> {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    /**
     * @params:
     * @return:
     * @desc: 自己监控的内存队列
     */
    private ArrayBlockingQueue<Request> requests;

    public RequestProcesserThread(ArrayBlockingQueue<Request> requests) {
        this.requests = requests;
    }

    @Override
    public Boolean call() {
        try {
            while (true) {
                logger.info("===工作线程处理请求1， 消费前队列请求数 = {}", requests.size());
                //线程不断的消费 take出来
                Request request = requests.take();

                logger.info("===工作线程处理请求2， 消费一个请求后队列请求数 = {}", requests.size());

                logger.info("===工作线程处理请求， 商品id = {}",request.getProductId());

                boolean forceRefrsh = request.isForceRefresh();

                // 先做读取请求的去重
                if (!forceRefrsh) {
                    RequestQueue requestQueue = RequestQueue.getInstance();
                    Map<Integer, Boolean> flagMap = requestQueue.getFlagMap();

                    if (request instanceof ProductInventoryUpdateRequest) {
                        // 如果是一个更新数据库的请求，那么久将那个productId对应的标致是指为true
                        flagMap.put(request.getProductId(), true);
                    } else if (request instanceof ProductInventoryCacheReloadRequest) {
                        //如果是缓存刷新的请求，那么就判断，如果标识不为空，而且是true，就说明之前有一个这个商品的数据库刷新请求
                        Boolean flag = flagMap.get(request.getProductId());
                        if (flag != null && flag) {
                            flagMap.put(request.getProductId(), false);
                        }

                        //如果flag是null
                        if (flag == null) {
                            flagMap.put(request.getProductId(), false);
                        }

                        //如果是缓存刷新的请求，而且发现标识不为空，但是标识是false 说明前面已经有一个数据更新的请求+ 一个缓存刷新的请求了
                        if (flag != null && !flag) {
                            //对于这种请求，就只过滤掉，不要放到后面的内存队列里去了
                            return true;
                        }
                    }
                }
                // 执行这个request操作
                request.process();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
}
